/**
 * 
 */
package com.movitech.mobile.cz.base.common.utils;
import java.io.UnsupportedEncodingException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringEscapeUtils;

/**
 * 字符串工具类, 继承org.apache.commons.lang3.StringUtils类
 * @author ThinkGem
 * @version 2013-05-22
 */
public class StringUtils extends org.apache.commons.lang3.StringUtils {
    
    private static final char SEPARATOR = '_';
    private static final String CHARSET_NAME = "UTF-8";
    
    /**
     * 转换为字节数组
     * @param str
     * @return
     */
    public static byte[] getBytes(String str){
        if (str != null){
            try {
                return str.getBytes(CHARSET_NAME);
            } catch (UnsupportedEncodingException e) {
                return null;
            }
        }else{
            return null;
        }
    }
    
    /**
     * 转换为字节数组
     * @param str
     * @return
     */
    public static String toString(byte[] bytes){
        try {
            return new String(bytes, CHARSET_NAME);
        } catch (UnsupportedEncodingException e) {
            return EMPTY;
        }
    }
    
    /**
     * 是否包含字符串
     * @param str 验证字符串
     * @param strs 字符串组
     * @return 包含返回true
     */
    public static boolean inString(String str, String... strs){
        if (str != null){
            for (String s : strs){
                if (str.equals(trim(s))){
                    return true;
                }
            }
        }
        return false;
    }
    
    /**
     * 替换掉HTML标签方法
     */
    public static String replaceHtml(String html) {
        if (isBlank(html)){
            return "";
        }
        String regEx = "<.+?>";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(html);
        String s = m.replaceAll("");
        return s;
    }
    
    /**
     * 替换为手机识别的HTML，去掉样式及属性，保留回车。
     * @param html
     * @return
     */
    public static String replaceMobileHtml(String html){
        if (html == null){
            return "";
        }
        return html.replaceAll("<([a-z]+?)\\s+?.*?>", "<$1>");
    }
    
    /**
     * 缩略字符串（不区分中英文字符）
     * @param str 目标字符串
     * @param length 截取长度
     * @return
     */
    public static String abbr(String str, int length) {
        if (str == null) {
            return "";
        }
        try {
            StringBuilder sb = new StringBuilder();
            int currentLength = 0;
            for (char c : replaceHtml(StringEscapeUtils.unescapeHtml4(str)).toCharArray()) {
                currentLength += String.valueOf(c).getBytes("GBK").length;
                if (currentLength <= length - 3) {
                    sb.append(c);
                } else {
                    sb.append("...");
                    break;
                }
            }
            return sb.toString();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return "";
    }
    
    
    /**
     * 转换为Double类型
     */
    public static Double toDouble(Object val){
        if (val == null){
            return 0D;
        }
        try {
            return Double.valueOf(trim(val.toString()));
        } catch (Exception e) {
            return 0D;
        }
    }

    /**
     * 转换为Float类型
     */
    public static Float toFloat(Object val){
        return toDouble(val).floatValue();
    }

    /**
     * 转换为Long类型
     */
    public static Long toLong(Object val){
        return toDouble(val).longValue();
    }

    /**
     * 转换为Integer类型
     */
    public static Integer toInteger(Object val){
        return toLong(val).intValue();
    }
    
    /**
     * 获得用户远程地址
     */
    public static String getRemoteAddr(HttpServletRequest request){
        String remoteAddr = request.getHeader("X-Real-IP");
        if (isNotBlank(remoteAddr)) {
            remoteAddr = request.getHeader("X-Forwarded-For");
        }else if (isNotBlank(remoteAddr)) {
            remoteAddr = request.getHeader("Proxy-Client-IP");
        }else if (isNotBlank(remoteAddr)) {
            remoteAddr = request.getHeader("WL-Proxy-Client-IP");
        }
        return remoteAddr != null ? remoteAddr : request.getRemoteAddr();
    }

    /**
     * 驼峰命名法工具
     * @return
     *         toCamelCase("hello_world") == "helloWorld" 
     *         toCapitalizeCamelCase("hello_world") == "HelloWorld"
     *         toUnderScoreCase("helloWorld") = "hello_world"
     */
    public static String toCamelCase(String s) {
        if (s == null) {
            return null;
        }

        s = s.toLowerCase();

        StringBuilder sb = new StringBuilder(s.length());
        boolean upperCase = false;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);

            if (c == SEPARATOR) {
                upperCase = true;
            } else if (upperCase) {
                sb.append(Character.toUpperCase(c));
                upperCase = false;
            } else {
                sb.append(c);
            }
        }

        return sb.toString();
    }

    /**
     * 驼峰命名法工具
     * @return
     *         toCamelCase("hello_world") == "helloWorld" 
     *         toCapitalizeCamelCase("hello_world") == "HelloWorld"
     *         toUnderScoreCase("helloWorld") = "hello_world"
     */
    public static String toCapitalizeCamelCase(String s) {
        if (s == null) {
            return null;
        }
        s = toCamelCase(s);
        return s.substring(0, 1).toUpperCase() + s.substring(1);
    }
    
    /**
     * 驼峰命名法工具
     * @return
     *         toCamelCase("hello_world") == "helloWorld" 
     *         toCapitalizeCamelCase("hello_world") == "HelloWorld"
     *         toUnderScoreCase("helloWorld") = "hello_world"
     */
    public static String toUnderScoreCase(String s) {
        if (s == null) {
            return null;
        }

        StringBuilder sb = new StringBuilder();
        boolean upperCase = false;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);

            boolean nextUpperCase = true;

            if (i < (s.length() - 1)) {
                nextUpperCase = Character.isUpperCase(s.charAt(i + 1));
            }

            if ((i > 0) && Character.isUpperCase(c)) {
                if (!upperCase || !nextUpperCase) {
                    sb.append(SEPARATOR);
                }
                upperCase = true;
            } else {
                upperCase = false;
            }

            sb.append(Character.toLowerCase(c));
        }

        return sb.toString();
    }
    
    /**
     * 如果不为空，则设置值
     * @param target
     * @param source
     */
    public static void setValueIfNotBlank(String target, String source) {
        if (isNotBlank(source)){
            target = source;
        }
    }
 
    /**
     * 转换为JS获取对象值，生成三目运算返回结果
     * @param objectString 对象串
     *   例如：row.user.id
     *   返回：!row?'':!row.user?'':!row.user.id?'':row.user.id
     */
    public static String jsGetVal(String objectString){
        StringBuilder result = new StringBuilder();
        StringBuilder val = new StringBuilder();
        String[] vals = split(objectString, ".");
        for (int i=0; i<vals.length; i++){
            val.append("." + vals[i]);
            result.append("!"+(val.substring(1))+"?'':");
        }
        result.append(val.substring(1));
        return result.toString();
    }
    
    public static String formatInteger(int value,String format){
    	DecimalFormat decimalFormat = new DecimalFormat(format); 
    	return decimalFormat.format(value);
    }
    
    public static List<String> getListBySplitStr(String str){
    	List<String> lstStr = new ArrayList<String>();
    	if(StringUtils.isNotEmpty(str)){
    		String[] arrStr = str.split("\\,");
    		for (int i = 0; i < arrStr.length; i++) {
				if(StringUtils.isNotEmpty(arrStr[i])){
					lstStr.add(arrStr[i]);
				}
			}
    	}
    	return lstStr;
    }
    
    public static String getListRemoveAndAdd(String str,String removeStr,String removeStrMultip,String addStr){
    	String result = "";
    	if(StringUtils.isNotEmpty(str)){
    		String[] arrStr = str.split("\\,");
    		for (int i = 0; i < arrStr.length; i++) {
				if(StringUtils.isNotEmpty(arrStr[i])){
					if(!StringUtils.equalsIgnoreCase(removeStr, arrStr[i])){
						if(StringUtils.isNotEmpty(result)) result += ",";
						result += arrStr[i];
					}
				}
			}
    	}
    	
    	if(StringUtils.isNotEmpty(removeStrMultip) && StringUtils.isNotEmpty(addStr)){
    		String[] arrStr = addStr.split("\\,");
    		String[] arrRemoveStrMultip = removeStrMultip.split("\\,");
    		for (int i = 0; i < arrStr.length; i++) {
				if(StringUtils.isNotEmpty(arrStr[i])){
					boolean isExist = false;
					for (String rmStr : arrRemoveStrMultip) {
						if(StringUtils.equalsIgnoreCase(rmStr, arrStr[i])){
							isExist = true;
							break;
						}
					}
					if(isExist == false){
						if(!StringUtils.contains(","+result+",", ","+arrStr[i]+",")){
    						if(StringUtils.isNotEmpty(result)) result += ",";
    						result += arrStr[i];
    					}
					}
				}
			}
    	}else{
    		if(StringUtils.isNotEmpty(addStr)){
    			String[] arrStr = addStr.split("\\,");
    			for (int i = 0; i < arrStr.length; i++) {
    				if(StringUtils.isNotEmpty(arrStr[i])){
    					if(!StringUtils.contains(","+result+",", ","+arrStr[i]+",")){
    						if(StringUtils.isNotEmpty(result)) result += ",";
    						result += arrStr[i];
    					}
    				}
    			}
    		}
    	}
    	return result;
    }
    
    public static String getListRemoveAndAdd(String str,String removeStr,String addStr){
    	String result = "";
    	if(StringUtils.isNotEmpty(str)){
    		String[] arrStr = str.split("\\,");
    		for (int i = 0; i < arrStr.length; i++) {
				if(StringUtils.isNotEmpty(arrStr[i])){
					if(!StringUtils.equalsIgnoreCase(removeStr, arrStr[i])){
						if(StringUtils.isNotEmpty(result)) result += ",";
						result += arrStr[i];
					}
				}
			}
    	}
    	
    	if(StringUtils.isNotEmpty(addStr)){
    		String[] arrStr = addStr.split("\\,");
			for (int i = 0; i < arrStr.length; i++) {
				if(StringUtils.isNotEmpty(arrStr[i])){
					if(!StringUtils.contains(","+result+",", ","+arrStr[i]+",")){
						if(StringUtils.isNotEmpty(result)) result += ",";
						result += arrStr[i];
					}
				}
			}
		}
    	return result;
    }
    
    public static String getListRemoveAndAdd(String exclusiveStr,String addStr){
    	String result = "";
    	if(StringUtils.isNotEmpty(exclusiveStr) && StringUtils.isNotEmpty(addStr)){
    		String[] arrStr = addStr.split("\\,");
    		String[] arrRemoveStrMultip = exclusiveStr.split("\\,");
    		for (int i = 0; i < arrStr.length; i++) {
				if(StringUtils.isNotEmpty(arrStr[i])){
					boolean isExist = false;
					for (String rmStr : arrRemoveStrMultip) {
						if(StringUtils.equalsIgnoreCase(rmStr, arrStr[i])){
							isExist = true;
							break;
						}
					}
					if(isExist == false){
						if(StringUtils.isNotEmpty(result)) result += ",";
						result += arrStr[i];
					}
				}
			}
    	}else{
    		if(StringUtils.isNotEmpty(addStr)){
				result = addStr;
    		}
    	}
    	return result;
    }
    
    public static String getListRemoves(String originStr,String removeStr){
    	String result = "";
    	if(StringUtils.isNotEmpty(originStr) && StringUtils.isNotEmpty(removeStr)){
    		List<String> lstOriginStrs = getListBySplitStr(originStr);
    		List<String> lstRemoveStrs = getListBySplitStr(removeStr);
    		for (String orgItem : lstOriginStrs) {
    			if(StringUtils.isNotEmpty(orgItem)){
    				boolean isExist = false;
    				for (String rmStr : lstRemoveStrs) {
    					if(StringUtils.equalsIgnoreCase(orgItem, rmStr)){
    						isExist = true;
							break;
    					}
					}
					if(isExist == false){
						if(StringUtils.isNotEmpty(result)) result += ",";
						result += orgItem;
					}
    			}
			}
    	}else{
    		if(StringUtils.isNotEmpty(originStr)){
				result = originStr;
    		}
    	}
    	return result;
    }
    
    public static void main(String[] args) {
		System.out.println(getListRemoveAndAdd("29,22,23", "29", "", "22,23"));
		
	}
    
    public static String getStrAddStr(String str,String additionStr){
    	String resultStr = "";
    	List<String> lstStr = getListBySplitStr(str);
    	if (lstStr!=null && lstStr.size()>0) {
			for (String val : lstStr) {
				if(StringUtils.isNotEmpty(resultStr)) resultStr += ",";
				resultStr += additionStr+val;
			}
		}else{
			resultStr = null;
		}
    	return resultStr;
    }
    

    public static String getStrAddsGoDuplicate(String str,String addStr){
    	String resultStr = str;
    	if(!StringUtils.containsIgnoreCase(","+str+",", ","+addStr+",")){
    		resultStr = str + "," + addStr;
    	}
    	return resultStr;
    }
}
